#include <vector>
#include "thread.hpp"
#include <unistd.h>

using namespace ThreadModlue;
//封装线程

int main()
{
    //先看用法
    //std::vector<Thread> threads;
    //线程的参数要传递什么呢？创建一个线程时pthread_creat会传递什么？
    //thread -> 输出型参数返回线程ID attr -> 设置属性 void(*start_routine)(void*) -> 线程执行的
    //函数 void * arg -> 指针参数
    //封装线程让我们创建线程的时候不需要传递这么多数据，使用控制线程的时候也只需要使用对外提供的接口

    // Thread t([](){
    //     while(true)
    //     {
    //         //今天让它干点简单的事情
    //         char name[128];
    //         pthread_getname_np(pthread_self(),name,sizeof(name));
    //         std::cout << "我是一个线程，我的名字是：" << name << std::endl;
    //         sleep(1);
    //     }
    // });
    // t.Start();
    // t.Detach();
    // sleep(5);

    // t.Stop();
    // sleep(5);
    // t.Join();

    //version2
    std::vector<Thread> threads;
    for(int i = 0;i < 10;i++)
    {
        //emplace_back的区别在于传递右值的时候emplace_back只能传递该临时对象的参数
        //而不能传递该临时对象本身（省去一次构造）
        threads.emplace_back([](){
            while(true)
            {
                char name[128];
                //对于字符串函数，应该传递sizeof(name)而不是sizeof(name) - 1
                pthread_getname_np(pthread_self(),name,sizeof(name));
                std::cout << "我是新线程 :" << name << std::endl;
                sleep(1);
            }
        });
    }

    for(auto &thread:threads)
    {
        thread.Start();
    }
    
    for(auto &thread:threads)
    {
        thread.Join();
    }

    return 0;
}